package org.grade.handler;

import cn.hutool.json.JSONUtil;
import org.grade.common.Result;
import org.grade.utils.SecurityUtil;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 用户认证失败时，返回一个包含错误信息的 JSON 响应
 * AuthenticationEntryPoint 是 Spring Security 框架中的一个接口，用于处理用户认证失败的情况。
 * 当用户尝试访问需要身份验证的资源但尚未完成身份验证时，会调用这个接口的方法
 */
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {

    /**
     * a. 首先创建一个 Result 对象，表示一个HTTP响应结果。这里设置 HTTP 状态码为 UNAUTHORIZED（401），表示用户尚未进行身份验证或身份验证失败。
     * b. 使用 JSONUtil.toJsonStr 方法将 Result 对象转换为 JSON 字符串。
     * c. 使用 SecurityUtil.renderString 方法将 JSON 字符串渲染到 HTTP 响应中。
     */
    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        Result result = new Result(HttpStatus.UNAUTHORIZED.value(), "用户认证失败");
        String json = JSONUtil.toJsonStr(result);
        // 处理异常
        SecurityUtil.renderString(response, json);
    }
}
